//! \file LeafBehaviors.h
//! \brief Defines the <code>fullsail_ai::fundamentals</code> leaf behavior classes.
//! \author Jeremiah Blanchard
#ifndef _FULLSAIL_AI_FUNDAMENTALS_LEAF_BEHAVIORS_H_
#define _FULLSAIL_AI_FUNDAMENTALS_LEAF_BEHAVIORS_H_

#include "../Behavior.h"

namespace fullsail_ai { namespace fundamentals {

	//! \brief C++ implementation of a leaf node in a behavior tree.
	class ProcessPercepts : public Behavior
	{
	public:
		ProcessPercepts(char const* _description) : Behavior(_description) {}
		bool run(void (*dataFunction)(Behavior const*), Agent* agent);
		bool isLeaf() const { return true; }
	};

	//! \brief C++ implementation of a leaf node in a behavior tree.
	class CheckForGold : public Behavior
	{
	public:
		CheckForGold(char const* _description) : Behavior(_description) {}
		bool run(void (*dataFunction)(Behavior const*), Agent* agent);
		bool isLeaf() const { return true; }
	};

	//! \brief C++ implementation of a leaf node in a behavior tree.
	class PickUpGold : public Behavior
	{
	public:
		PickUpGold(char const* _description) : Behavior(_description) {}
		bool run(void (*dataFunction)(Behavior const*), Agent* agent);
		bool isLeaf() const { return true; }
	};

	//! \brief C++ implementation of a leaf node in a behavior tree.
	class ShootWumpus : public Behavior
	{
	public:
		ShootWumpus(char const* _description) : Behavior(_description) {}
		bool run(void (*dataFunction)(Behavior const*), Agent* agent);
		bool isLeaf() const { return true; }
	};

	//! \brief C++ implementation of a leaf node in a behavior tree.
	class ExploreDirection : public Behavior
	{
	private:
		Direction direction;

	public:
		ExploreDirection(char const* _description, Direction _direction) : Behavior(_description), direction(_direction) {}
		bool run(void (*dataFunction)(Behavior const*), Agent* agent);
		bool isLeaf() const { return true; }
	};
	
	//! \brief C++ implementation of a leaf node in a behavior tree (this one does nothing; just a place holder.)
	class LeafBehavior : public Behavior
	{
	private:
		bool value;
	public:
		LeafBehavior(char const* _description, bool _value) : Behavior(_description), value(_value) {}
		bool run(void (*dataFunction)(Behavior const*), Agent* agent);
		bool isLeaf() const { return true; }
	};
}}  // namespace fullsail_ai::fundamentals

#endif  // _FULLSAIL_AI_FUNDAMENTALS_LEAF_BEHAVIORS_H_
